package com.xk.springboot.controller;


import com.xk.springboot.config.SystemConfig;
import com.xk.springboot.dto.ResponseData;
import com.xk.springboot.dto.ResultData;
import com.xk.springboot.exception.UploadException;
import com.xk.springboot.utils.MyStringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

/**
 * @author:Teacher黄
 * @date:Created at 2020/04/09
 */
@Controller
@RequestMapping("/upload")
public class UploadController {

    @Autowired
    private SystemConfig systemConfig;


    /**
     * 上传的页面
     * @return
     */
    @GetMapping("/page")
    public String page(){
        return "upload";
    }


    /**
     * 文件上传的操作
     * @param header
     * @param headerName
     * @return
     */
    @PostMapping("/do")
    public String uploadDo(MultipartFile header, String headerName, Model model){
        try {
            // 具体的文件上传逻辑
            System.out.println(headerName);

            // 上传的文件名
            String originalFilename = header.getOriginalFilename();
            // 处理名字
            // 生成一个UUID的名字
            String uniqueFileName = MyStringUtil.getUniqueFileName();
            // 获取当前文件的后缀
            String ext = MyStringUtil.getExt(originalFilename);
            // 很可能上传后缀有问题, 我们两种解决方案
            // 1. 直接抛出异常
            // 2. 直接给定一个默认的后缀
            ext = MyStringUtil.defaultExt(ext, systemConfig.getDefaultExt());
            // 限制文件上传的后缀
            String allowExts = systemConfig.getAllowExts();
            if (!allowExts.contains(ext)) {
                // 抛出错误
                throw new Exception("后缀不允许!只允许上传:"+allowExts);
            }
            // 准备一个上传的路径
            String uploadPath = systemConfig.getUploadPath();
            // 处理文件存放的目录 : 日期目录  /2020/04/09/文件
            // 如果一个文件夹下面存放的文件数量过多, 查询起来效率偏慢
            String dateDir = MyStringUtil.getDateDir(uploadPath);

            // 抽象出上传的文件对象
            File uploadFile = new File(uploadPath+"/"+dateDir,uniqueFileName+"."+ext);
            // 上传
            header.transferTo(uploadFile);

            // 给一个提示信息
            model.addAttribute("msg","上传成功");
        } catch (Exception e) {
            model.addAttribute("error",e.getMessage());
        }

        return "upload";
    }


    /**
     * 文件上传操作返回json
     * @param header : 文件对象
     * @param headerName : 文件别名
     * @return
     */
    @PostMapping("/do2")
    @ResponseBody
    public ResultData uploadDo2(MultipartFile header, String headerName) throws IOException {
        // 具体的文件上传逻辑
        System.out.println(headerName);

        // 上传的文件名
        String originalFilename = header.getOriginalFilename();
        // 处理名字
        // 生成一个UUID的名字
        String uniqueFileName = MyStringUtil.getUniqueFileName();
        // 获取当前文件的后缀
        String ext = MyStringUtil.getExt(originalFilename);
        // 很可能上传后缀有问题, 我们两种解决方案
        // 1. 直接抛出异常
        // 2. 直接给定一个默认的后缀
        ext = MyStringUtil.defaultExt(ext, systemConfig.getDefaultExt());
        // 限制文件上传的后缀
        String allowExts = systemConfig.getAllowExts();
        if (!allowExts.contains(ext)) {
            // 抛出错误
            throw new UploadException(4001,"后缀不允许!只允许上传:"+allowExts);
        }
        // 准备一个上传的路径
        String uploadPath = systemConfig.getUploadPath();
        // 处理文件存放的目录 : 日期目录  /2020/04/09/文件
        // 如果一个文件夹下面存放的文件数量过多, 查询起来效率偏慢
        String dateDir = MyStringUtil.getDateDir(uploadPath);

        // 抽象出上传的文件对象
        File uploadFile = new File(uploadPath+"/"+dateDir,uniqueFileName+"."+ext);
        // 上传
        header.transferTo(uploadFile);

        // 文件上传成功
        return ResponseData.success("上传成功!");
    }
}
